package com.yxp.manager.common;

import com.yxp.manager.exception.BizException;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.Serializable;

@NoArgsConstructor
@Setter
public class ServerResponse<T> implements Serializable {

    private static final long serialVersionUID = 410363341963169346L;

    private String status;
    private String msg;
    private T data;

    /**
     * @author hlw
     * 方言，0中文
     * @since 2019/2/14
     */
    public static int locale = 0;

    private ServerResponse(String status) {
        this.status = status;
    }

    private ServerResponse(String status, T data) {
        this.status = status;
        this.data = data;
    }

    private ServerResponse(String status, String msg, T data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    private ServerResponse(String status, String msg) {
        this.status = status;
        this.msg = msg;
    }


    public boolean isSuccess() {
        return this.status.equals(ResponseCode.SUCCESS.getCode());
    }

    public String getStatus() {
        return status;
    }

    public T getData() {
        return data;
    }

    /**
     * 获取响应数据<br/>
     * 如果response非success状态，则抛出 status,msg 异常
     *
     * @author yxp
     * @date 2019/9/10 16:34
     */
    public T getData(boolean checkResponse) {
        if (checkResponse && !isSuccess()) {
            throw new BizException(this.status, this.msg);
        }
        return data;
    }

    /**
     * 获取响应数据<br/>
     * 如果response非success状态，则抛出 status,msg 异常<br/>
     * 如果 data 为null，则抛出 UNKNOWN_ERROR 异常
     *
     * @author yxp
     * @date 2019/9/10 16:40
     */
    public T getData(boolean checkResponse, boolean checkData) {
        return getData(checkResponse, checkData, ResponseCode.UNKNOWN_ERROR);
    }

    /**
     * 获取响应数据<br/>
     * 如果response非success状态，则抛出 status,msg 异常<br/>
     * 如果 data 为null，则抛出指定的 ResponseCode 异常
     *
     * @author yxp
     * @date 2019/9/10 16:40
     */
    public T getData(boolean checkResponse, boolean checkData, ResponseCode dataNullResponseCode) {
        if (checkResponse && !isSuccess()) {
            throw new BizException(this.status, this.msg);
        }
        if (checkData && data == null) {
            throw new BizException(dataNullResponseCode);
        }
        return data;
    }

    public String getMsg() {
        return msg;
    }

    /**
     * <p>
     * 默认的成功消息
     * </p>
     *
     * @return
     * @author Sam
     * @since 2018年6月8日
     */
    public static <T> ServerResponse<T> createBySuccess() {
        return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getDesc(locale));
    }

    /* *
     * <p>
     * 带消息内容的成功消息
     * </p>
     *
     * @param msg
     * @return
     * @author Sam
     * @since 2018年6月8日
     */
    /*public static <T> ServerResponse<T> createBySuccessMessage(String msg) {
        return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg);
    }*/

    /**
     * <p>
     * 带数据对象的成功消息
     * </p>
     *
     * @param data
     * @return
     * @author Sam
     * @since 2018年6月8日
     */
    public static <T> ServerResponse<T> createBySuccess(T data) {
        return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getDesc(locale), data);
    }

    /* *
     * <p>
     * 带消息内容加对象的成功消息
     * </p>
     *
     * @param msg
     * @param data
     * @return
     * @author Sam
     * @since 2018年6月8日
     */
    /*public static <T> ServerResponse<T> createBySuccess(String msg, T data) {
        return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg, data);
    }*/

    /**
     * <p>
     * 错误消息
     * </p>
     *
     * @return
     * @author Sam
     * @since 2018年6月8日
     */
    public static <T> ServerResponse<T> createByError() {
        return new ServerResponse<T>(ResponseCode.UNKNOWN_ERROR.getCode(), ResponseCode.UNKNOWN_ERROR.getDesc(locale));
    }

    /* *
     * <p>
     * 带消息内容的错误消息
     * </p>
     *
     * @param errorMessage
     * @return
     * @author Sam
     * @since 2018年6月8日
     */
    /*public static <T> ServerResponse<T> createByErrorMessage(String errorMessage) {
        return new ServerResponse<T>(ResponseCode.UNKNOWN_ERROR.getCode(), errorMessage);
    }*/

    /**
     * 错误码，消息内容自定义的消息，优先使用参数为ResponseCode的方法
     */
    @Deprecated
    public static <T> ServerResponse<T> createByErrorCodeMessage(String errorCode, String errorMessage) {
        return new ServerResponse<T>(errorCode, errorMessage);
    }

    /* *
     * <p>
     * 错误码，消息内容，消息对象自定义的消息
     * </p>
     *
     * @param errorCode
     * @param errorMessage
     * @param data
     * @return
     * @author Sam
     * @since 2018年6月8日
     */
    /*public static <T> ServerResponse<T> createByErrorCodeMessage(String errorCode, String errorMessage, T data) {
        return new ServerResponse<T>(errorCode, errorMessage, data);
    }*/

    /**
     * <p>
     * 返回消息
     * </p>
     *
     * @param responseCode
     * @return
     * @author Sam
     * @since 2018年6月8日
     */
    public static <T> ServerResponse<T> createByResponse(ResponseCode responseCode) {
        return new ServerResponse<T>(responseCode.getCode(), responseCode.getDesc(locale));
    }

    /**
     * <p>
     * 返回消息，带消息对象
     * </p>
     *
     * @param responseCode
     * @return
     * @author Sam
     * @since 2018年6月8日
     */
    public static <T> ServerResponse<T> createByResponse(ResponseCode responseCode, T data) {
        return new ServerResponse<T>(responseCode.getCode(), responseCode.getDesc(locale), data);
    }

}
